package utility

import (
	"context"
	"time"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/google/uuid"
)

// 生成唯一log_id（UUID v4）
func GenerateLogID() string {
	return uuid.New().String()
}

const (
	CtxLogIDKey = "X-Log-Id" // 上下文中的LogID键名
)

// LogID 中间件生成和传递LogID
func LogID(r *ghttp.Request) {
	ctx := r.Context()

	// 尝试从请求头获取LogID
	logID := r.Header.Get("X-Log-Id")
	if logID == "" {
		// 生成UUID作为LogID
		logID = GenerateLogID()
	}

	// 将LogID设置到上下文中
	newCtx := context.WithValue(ctx, CtxLogIDKey, logID)
	r.SetCtx(newCtx)

	// 在响应头中添加LogID
	r.Response.Header().Set("X-Log-Id", logID)

	// 记录请求开始时间
	start := time.Now()

	// 执行后续中间件和业务逻辑
	r.Middleware.Next()

	// 计算请求耗时
	cost := time.Since(start)

	// 记录访问日志（包含LogID）
	g.Log().Printf(r.Context(),
		"[ACCESS] log_id:%s | method:%s | url:%s | ip:%s | status:%d | cost:%s",
		logID,
		r.Method,
		r.Request.URL.String(),
		r.GetClientIp(),
		r.Response.Status,
		cost.String(),
	)
}
